iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0

今天開始要來介紹自定義強化學習的環境,通常每個人寫環境的方法都有不同,我只是把我的習慣分享給大家,並不是唯一解。各位也可以到github上看看其他大神的環境寫法,站在巨人的肩膀上也是一個聰明的做法喔。

自定義環境習慣分享

有一些人喜歡將所有code塞在同一個檔案裏面,而有一些人喜歡根據功能,將程式分成很多檔案,各個部分各司其職。我是比較偏向於後者的,當然這個習慣沒有好壞之分,在開發程式上的能以對自己來說最流暢的話才是最好的。接下來我會先介紹通常我用於一些模擬物件的檔案,例如機器人或者目標物之類的,我會習慣創一個src.py來存放這些模型。

src.py

這個檔案通常是用來存放物件的,通常就定義__init__()方法,這是會宣告模型ID跟基本資訊的。另外也有一些方法就看實際上要做甚麼才會定義。例如地板的。

class Plane:
    def __init__(self):
        p.setAdditionalSearchPath(pybullet_data.getDataPath())
        self.planeId = p.loadURDF("plane.urdf")

還有R2D2的,這邊有定義一個move()方法,如果要移動就會使用這個方法。

class R2D2:
    def __init__(self):
        p.setAdditionalSearchPath(pybullet_data.getDataPath())
        self.r2d2StartPos = [0, 0, 0.5]
        self.r2d2StartOrientation = p.getQuaternionFromEuler([0, 0, 3*np.pi/2])
        self.r2d2ID = p.loadURDF("r2d2.urdf",self.r2d2StartPos, self.r2d2StartOrientation)
        self.numJoints = p.getNumJoints(self.r2d2ID)
        self.targetVel = 0
        self.maxForce = 100
        self.Pmode = p.POSITION_CONTROL

    def move(self,rf,rb,lf,lb):#left front,right front,left back,right back
        p.setJointMotorControl2(self.r2d2ID, jointIndex=2, controlMode=p.VELOCITY_CONTROL, targetVelocity=rf)
        p.setJointMotorControl2(self.r2d2ID, jointIndex=3, controlMode=p.VELOCITY_CONTROL, targetVelocity=rb)
        p.setJointMotorControl2(self.r2d2ID, jointIndex=6, controlMode=p.VELOCITY_CONTROL, targetVelocity=lf)
        p.setJointMotorControl2(self.r2d2ID, jointIndex=7, controlMode=p.VELOCITY_CONTROL, targetVelocity=lb)

剩下就是物體跟圍牆的,target有一個參數random_pos。如果想先測試的話可以先設定為False,看看訓練過後機器人能不能順利往前走。

預設是True,讓target隨機生成才可以比較好的審視訓練情況,這個物件有另一個方法reset_spawn(),在環境reset的時候會重新生成target。

class Target:
    def __init__(self,random_pos=True):
        if random_pos:
            pos = [np.random.random()*4-2,np.random.random()*4-2,0]
            self.targetStartPos = pos
        else:
            self.targetStartPos = [1,0,0]
        self.targetStartOrientation = p.getQuaternionFromEuler([0, 0, 0])
        self.targetID = p.loadURDF("target.urdf", self.targetStartPos, self.targetStartOrientation)
		def reset_spawn(self):
        p.removeBody(self.targetID)
        Target()
class Wall:
    def __init__(self,pos=[0, 0, 0]):
        self.wallStartPos = pos
        self.wallStartOrientation = p.getQuaternionFromEuler([0, 0, 0])
        self.wallID = p.loadURDF("wall.urdf", self.wallStartPos, self.wallStartOrientation)

其他如果有不同功能(例如要進行預處理或者新增一些方便使用者操作的功能的話,也可以隨各位所好去新增專用的檔案或者副程式等等)

結語

有了這些物件後,我們在建立環境的時候就可以很輕鬆地呼叫這些類別,在控制上也可以很輕鬆地使用類別的方法,也可以使程式碼不會太冗長,明天開始就會將環境主體給建立好(終於阿),建立好環境後就要來使用強化學習的模組來訓練了!


上一篇
D16:URDF實作&強化學習環境設計
下一篇
D18:自定義環境(2/2)
系列文
高中生也可以!利用強化學習讓機器人動起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言